#include <Arduino.h>

// 2022.6.14——ESP01S 的blinker 文本框作为报警提示 调试完成
/* ////////////////////////////////////////////////
    实验板：ESP01S
    版本：V0.4
    更改内容:
        V0.1：blinker按键开关调试完成
            1.图标，颜色，文本显示
        V0.2：blinker数字显示num(无会员)调试完成
            1.使用心跳包更新数据
        V0.3：blinker数字显示num(有会员)调试完成
            1.使用RT实时更新数据num数据和图表数据
            2.图表实时和储存数据库可视化显示（注意不管什么实时显示，都有在RT包中添加对应的变量更新）
            3.增加了随机数据的生成，用于测试
        V0.4:文本框作为报警提示 调试完成
            1.发现num不能使用方法改变图标和文本，只能用文本框来代替
*/
////////////////////////////////////////////////

#define BLINKER_PRINT Serial
#define BLINKER_WIFI
#define serial_data_num 5
#define ON 1
#define OFF 2

#include <Blinker.h>

char auth[] = "e8aa3e63d644";
char ssid[] = "TRJSKY_Wen1-bei";
char pswd[] = "TRJSKY2021#";

// 新建按键对象和对应变量
char b_on;
BlinkerButton Button_on("b_on");
char b_lsens;
BlinkerButton Button_lsens("b_lsens");
char b_dth;
BlinkerButton Button_dth("b_dth");
char b_711;
BlinkerButton Button_711("b_711");

//新建数字显示对象和对应变量
int n_lsens=10;
BlinkerNumber Number_lsens("n_lsens");
int n_tem=20;
BlinkerNumber Number_tem("n_tem");
int n_hum=30;
BlinkerNumber Number_hum("n_hum");
int n_711=0;
BlinkerNumber Number_711("n_711");
int n_remote=0;
BlinkerNumber Number_remote("n_remote");

//
BlinkerText Text_clothes("t_clothes");
BlinkerText Text_weather("t_weather");


//=按键回调函数
// 舵机按键开关回调函数
void button_on_callback(const String &state)
{
    // BLINKER_LOG("get button state: ", state); //串口打印get button state:
    if (state == "on")
    {
        digitalWrite(LED_BUILTIN, LOW);
        b_on=ON;
        Button_on.color("#1E90FF");                 //蓝色
        Button_on.icon("fas fa-angle-double-down"); //图标变化
        Button_on.text("衣架已升起");                 //文字显示
        Button_on.print("on");                      // 反馈开关状态
    }
    else if (state == "off")
    {
        digitalWrite(LED_BUILTIN, HIGH);
        b_on=OFF;
        Button_on.color("#1E90FF");
        Button_on.icon("fas fa-angle-double-up");
        Button_on.text("衣架已降下");
        Button_on.print("off"); // 反馈开关状态
    }
}
// 光敏按键开关回调函数
void button_lsens_callback(const String &state)
{
    // BLINKER_LOG("get button state: ", state); //串口打印get button state:
    if (state == "on")
    {
        digitalWrite(LED_BUILTIN, LOW);
        b_lsens=ON;
        Button_lsens.color("#1E90FF");                 //蓝色
        Button_lsens.icon("fas fa-lightbulb"); //图标变化
        Button_lsens.text("光敏模块开启");                 //文字显示
        Button_lsens.print("on");                      // 反馈开关状态
    }
    else if (state == "off")
    {
        digitalWrite(LED_BUILTIN, HIGH);
        b_lsens=OFF;
        Button_lsens.color("#1E90FF");
        Button_lsens.icon("far fa-lightbulb-slash");
        Button_lsens.text("光敏模块关闭");
        Button_lsens.print("off"); // 反馈开关状态
    }
}
//温湿度按键开关回调函数
void button_dth_callback(const String &state)
{
    // BLINKER_LOG("get button state: ", state); //串口打印get button state:
    if (state == "on")
    {
        digitalWrite(LED_BUILTIN, LOW);
        b_dth=ON;
        Button_dth.color("#1E90FF");                 //蓝色
        Button_dth.icon("fas fa-tint"); //图标变化
        Button_dth.text("温湿度检测开启");                 //文字显示
        Button_dth.print("on");                      // 反馈开关状态
    }
    else if (state == "off")
    {
        digitalWrite(LED_BUILTIN, HIGH);
        b_dth=OFF;
        Button_dth.color("#1E90FF");
        Button_dth.icon("fas fa-tint-slash");
        Button_dth.text("温湿度检测关闭");
        Button_dth.print("off"); // 反馈开关状态
    }
}
// 称重按键开关回调函数
void button_711_callback(const String &state)
{
    // BLINKER_LOG("get button state: ", state); //串口打印get button state:
    if (state == "on")
    {
        digitalWrite(LED_BUILTIN, LOW);
        b_711=ON;
        Button_711.color("#1E90FF");                 //蓝色
        Button_711.icon("fas fa-hand-holding-water"); //图标变化
        Button_711.text("干湿检测开启");                 //文字显示
        Button_711.print("on");                      // 反馈开关状态
    }
    else if (state == "off")
    {
        digitalWrite(LED_BUILTIN, HIGH);
        b_711=OFF;
        Button_711.color("#1E90FF");
        Button_711.icon("fas fa-hand-holding-water");
        Button_711.text("干湿检测关闭");
        Button_711.print("off"); // 反馈开关状态
    }
}


//=实时数据更新回调和数据储存回调
// 如果未绑定的组件被触发，则会执行其中内容
void dataRead(const String &data)
{
    // BLINKER_LOG("Blinker readString: ", data);
    // counter++;
    // Number1.print(counter);
}
//实时数据包，用于发送数据同步（每1s同步一次数据，注意函数的变化）
void RTdata()
{
    Blinker.sendRtData("n_lsens", n_lsens);//使用实时数据功能，可以将数据更新频率提升至每秒一次
    Blinker.sendRtData("n_tem", n_tem);
    Blinker.sendRtData("n_hum", n_hum);
    Blinker.sendRtData("n_711", n_711);
    Blinker.sendRtData("n_remote", n_remote);
    //图表的实时显示数据，不添加这个，图表的实时显示没有，只会显示最近一小时的数据（储存数据）
    Blinker.sendRtData("n_tem", n_tem);
    Blinker.sendRtData("n_hum", n_hum);
    Blinker.sendRtData("n_711", n_711);
    //

    // Number_lsens.print(n_lsens);         //每半分钟刷新一次
    // Number_tem.print(n_tem);
    // Number_hum.print(n_hum);
    // Number_711.print(n_711);
    // Number_remote.print(n_remote);
    Blinker.printRtData();//Blinker.printRtData调用后，才可正常发送数据。
}
//开启图标数据储存，键值对，用于最近一小时和之后的数据存储
void dataStorage()
{
    Blinker.dataStorage("n_tem", n_tem);
    Blinker.dataStorage("n_hum", n_hum);
    Blinker.dataStorage("n_711", n_711);
}



void setup()
{
    //-1.初始化串口
    Serial.begin(115200);
#if defined(BLINKER_PRINT)
    BLINKER_DEBUG.stream(BLINKER_PRINT);//用于指定调试信息输出的串口，设备开发时调试使用
#endif
    //-2.初始化有LED的IO
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, HIGH);
    //-3.初始化blinker
    Blinker.begin(auth, ssid, pswd);
    Blinker.attachData(dataRead);
    //-4.按键开关绑定
    Button_on.attach(button_on_callback);
    Button_lsens.attach(button_lsens_callback);
    Button_dth.attach(button_dth_callback);
    Button_711.attach(button_711_callback);
    //-5.初始化数据储存和实时数据
    Blinker.attachRTData(RTdata);
    Blinker.attachDataStorage(dataStorage);

}

void loop()
{
    Blinker.run();

    n_lsens=random(300);
    n_tem=random(35);
    n_hum=random(300);
    n_711=random(300);
    n_remote=random(300);

    //数据判断操作
    if(n_tem>=30)
    {
        Text_clothes.color("#DC143C");//红色
        Text_clothes.print("高温预警","立刻检查");
    }
    else
    {
        Text_clothes.color("#6495ED");
        Text_clothes.print("温度正常","无需操作");
    }
    if(n_hum>=200)
    {
        Text_weather.color("#0000FF");//红色
        Text_weather.print("衣服已干","1小时前");
    }
    else
    {
        Text_weather.color("#008000");
        Text_weather.print("衣服未干","无需操作");
    }


    Blinker.delay(5000);
}
